package com.example.service;

import java.util.List;

public interface IRedisService {
    /**
     * 获取锁
     * @param lockName 锁名称
     * @param effectiveTime 锁有效时间，单位秒
     * @return
     */
    Boolean getLock(String lockName, Object value,int effectiveTime);
    /**
     * 获取锁
     * @param lockName 锁名称
     * @param effectiveTime 锁有效时间，单位秒
     * @return
     */
    Boolean getLock(String lockName, int effectiveTime);

    /**
     * 设置缓存值
     * @param key
     * @param value
     * @param <T>
     */
    <T> void setValue(String key, T value);

    /**
     * 设置缓存值，并设置有效时间
     * @param key
     * @param value
     * @param effectiveTime
     * @return
     * @param <T>
     */
    <T> void setValue(String key, T value,int effectiveTime);

    /**
     * 获取缓存值
     * @param key
     * @return
     */
    Object getValue(String key);

    /**
     * 获取缓存值具体类型
     * @param key
     * @param clazz
     * @return
     * @param <T>
     */
    <T> T getValue(String key, Class<T> clazz);

    /**
     * 左推值
     * @param key
     * @param value
     * @param <T>
     */
    <T> void leftPush(String key, T value);

    /**
     * 右推值
     * @param key
     * @param value
     * @param <T>
     */
    <T> void rightPush(String key, T value);

    /**
     * 右弹队列值
     * @param key
     * @return
     */
    Object rightPop(String key);

    /**
     * 右弹队列值
     * @param key
     * @param clazz
     * @return
     * @param <T>
     */
    <T> T rightPop(String key, Class<T> clazz);

    /**
     * 左弹队列值
     * @param key
     * @return
     */
    Object leftPop(String key);

    /**
     * 左弹队列值
     * @param key
     * @param clazz
     * @return
     * @param <T>
     */
    <T> T leftPop(String key, Class<T> clazz);

    /**
     * 是否存在key
     * @param key
     * @return
     */
    Boolean hasKey(String key);

    /**
     * 删除key
     * @param key
     */
    void delKey(String key);

    /**
     * 删除key
     * @param keys
     */
    void delKey(List<String> keys);

    /**
     * key过期
     * @param key
     * @param effectiveTime
     */
    void expire(String key, int effectiveTime);

    /**
     * 批量获取缓存值
     * @param keys
     * @param clazz
     * @return
     * @param <T>
     */
    <T> List<T> batch(List<String> keys, Class<T> clazz);

    /**
     * 是否限制次数访问
     * @param key
     * @param count
     * @param maxExpireTime
     * @return
     */
    boolean limitCount(String key,Integer count,Integer maxExpireTime);

    /**
     * 是否限制次数访问 并设置值
     * @param key
     * @param count
     * @param maxExpireTime
     * @param key2
     * @param value
     * @return
     */
    public boolean limitWithStr(String key,Integer count,Integer maxExpireTime,String key2,String value);

    /**
     * 递增
     * @param key
     * @param step
     */
    void increment(String key,long step);

    /**
     * 获取key的过期时间
     * @param key
     * @return
     */
    Long getKeyExpire(String key);

    /**
     * scanKeys
     * @param pattern 正则
     * @param count 匹配数量
     * @return
     */
    List<String> scanKeys(String pattern, int count);
}
